package ygw.study.tool;

import org.apache.axiom.util.base64.Base64Utils;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;

/**
 * <p>
 * 自定义 Base64 工具类
 * </p>
 * <p>
 * Copyright:.All rights reserved.
 * </p>
 * <p>
 * Company:Zsoft
 * </p>
 * <p>
 * CreateDate: 2022-08-16
 * </p>
 *
 * @author YuGongWen
 * @history Mender: YuGongWen；Date: 2022-08-16；
 */
public class MyBase64Utils {



    /**
     * 获取字符串的 Base64 字符串
     * 由于【+】会被系统拦截器替换为空个，所以【+】会提前替换为 28343746
     * 由于【=】会被系统拦截器替换为空个，所以【=】会提前替换为 87284389
     * 由于【/】会被系统拦截器替换为空个，所以【/】会提前替换为 09903904
     *
     * @param inputStr
     * @return
     */
    public static String getBase64Str(String inputStr) {
        if (StringUtils.isBlank(inputStr)) {
            return inputStr;
        }

        String base64Str = Base64Utils.encode(inputStr.getBytes(StandardCharsets.UTF_8));

        base64Str = StringUtils.replace(base64Str, "+", "28343746");
        base64Str = StringUtils.replace(base64Str, "=", "87284389");
        base64Str = StringUtils.replace(base64Str, "/", "09903904");
        return base64Str;
    }


    /**
     * 解码 Base64 字符串
     * 由于【+】会被系统拦截器替换为空个，所以【+】会提前替换为 28343746
     * 由于【=】会被系统拦截器替换为空个，所以【=】会提前替换为 87284389
     * 由于【/】会被系统拦截器替换为空个，所以【/】会提前替换为 09903904
     *
     * @param base64Str
     * @return
     */
    public static String getStrByBase64(String base64Str) {
        if (StringUtils.isBlank(base64Str)) {
            return base64Str;
        }

        if (ifBase64Str(base64Str)) {
            // nothing to do
        } else {
            // 非 Base64 格式，不做处理，直接返回
            return base64Str;
        }
        base64Str = StringUtils.replace(base64Str, "28343746", "+");
        base64Str = StringUtils.replace(base64Str, "87284389", "=");
        base64Str = StringUtils.replace(base64Str, "09903904", "/");

        byte[] decode = Base64Utils.decode(base64Str);
        return new String(decode, StandardCharsets.UTF_8);
    }

    /**
     * 判断字符串是否为 Base64 格式
     *
     * @param str
     * @return
     */
    public static boolean ifBase64Str(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        String base64Pattern = "^([A-Za-z0-9+/])*([A-Za-z0-9+/]|[A-Za-z0-9+/]=|[A-Za-z0-9+/])$";
        if (Pattern.matches(base64Pattern, str)) {
            return true;
        } else {
            return false;
        }
    }





}
